import os
import chardet


def merge_files(folder_path):
    """
    将文件夹中的所有代码文件内容合并到一个列表中
    :param folder_path: 文件夹路径
    :return: 文件内容列表
    """
    file_contents = []  # 用于存储所有文件的内容

    # 获取文件夹中的文件列表
    file_list = os.listdir(folder_path)
    # 按照名称排序
    file_list.sort()

    for f in file_list:
        # 获取文件路径
        file_path = os.path.join(folder_path, f)

        # 如果是文件夹，则递归处理
        if os.path.isdir(file_path):
            file_contents.extend(merge_files(file_path))
        # 如果是代码文件，则添加到列表中
        elif f.endswith(('.py', '.cpp', '.c', '.java', '.json')):
            print(f"正在处理文件：{file_path}")
            # 获取文件名
            filename = os.path.splitext(f)[0]
            # 读取文件内容
            try:
                with open(file_path, mode='r', encoding='utf-8') as code_file:
                    content = code_file.read()
            except UnicodeDecodeError as e:
                encoding = chardet.detect(
                    open(file_path, 'rb').read())['encoding']
                print(f"Error: {e}, try encoding: {encoding}")
                try:
                    with open(file_path, mode='r', encoding=encoding) as code_file:
                        content = code_file.read()
                except Exception as e1:
                    print(f"Error: {e1}, skip {file_path}")
                    continue

            # 将文件名和内容添加到列表中
            file_contents.append(f"{filename}\n{'-'*50}\n")
            content = content.replace('\t', ' ' * 4)  # 将制表符替换为四个空格
            file_contents.append(f"{content}\n\n")

    return file_contents


if __name__ == '__main__':
    # 设置输入文件夹路径
    folder_path = r'D:\HuaweiMoveData\Users\sqx123\Desktop\2025_spring\FATAL_ERROR_No_Coffee_Detected\CampusOddity'
    # 设置输出txt文件名
    output_file = 'output.txt'

    # 合并文件内容
    file_contents = merge_files(folder_path)

    # 将所有内容写入文件
    with open(output_file, mode='w', encoding='utf-8') as out_file:
        out_file.writelines(file_contents)

    print(f"共写入 {len(file_contents)} 个文件内容。")
